﻿using System;
using System.Collections.Generic;
using System.Data;
using MySql.Data.MySqlClient;
using SiGeCoPre.Presupuesto_Conexion;
using SiGeCoPre.Presupuesto_Entities;
using SiGeCoPre.Presupuesto_Excepcion;
using SiGeCoPre.Presupuesto_Util;

namespace SiGeCoPre.Presupuesto_DAOIMPL
{
    /// <summary>
    /// Clase que implementa DAOEmpleados
    /// </summary>
    class DAOIMPLEmpleados:Presupuesto_DAO.DAOEmpleados
    {
        /// <summary>
        /// Guarda un empleado
        /// </summary>
        /// <param name="idSector">Indice del sector al que pertenece el empleado</param>
        /// <param name="nombre">Nombre del empleado</param>
        /// <param name="apellido">Apellido del empleado</param>
        /// <param name="usuario">Usuario del empleado</param>
        /// <param name="password">Contraseña del empleado</param>
        /// <param name="mail">Mail del empleado</param>
        /// <param name="activo">Determina si está activo en la base de datos</param>
        /// <returns>Devuelve true si fue ingresado correctamente o false si falló</returns>
        public bool saveEmpleado(int idSector, string nombre, string apellido, string usuario, string password, string mail, bool activo)
        {
            Boolean correcto = false;
            MySqlConnection conexion = Conexion.conexionMySQL();
            try
            {
               
                conexion.Open();
                MySqlCommand insertar = conexion.CreateCommand();
                insertar.CommandText = "INSERT INTO empleados(id_sector,Nombre, Apellido, Usuario, Password, Mail, Activo) VALUES(@idSector,@nombre, @apellido, @usuario, @password, @mail, @activo)";
                insertar.Parameters.AddWithValue("@idSector", idSector);
                insertar.Parameters.AddWithValue("@nombre", nombre);
                insertar.Parameters.AddWithValue("@apellido", apellido);
                insertar.Parameters.AddWithValue("@usuario", usuario);
                insertar.Parameters.AddWithValue("@password", password);
                insertar.Parameters.AddWithValue("@mail", mail);
                insertar.Parameters.AddWithValue("@activo", activo);
                insertar.ExecuteNonQuery();
                correcto = true;
                conexion.Close();
                conexion.Dispose();
            }
            catch (Exception ex)
            {
                correcto = false;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return correcto;
        }

        /// <summary>
        /// Modifica un empleado
        /// </summary>
        /// <param name="idSector">Indice del sector al que pertene el empleado</param>
        /// <param name="nombre">Nombre del empleado</param>
        /// <param name="apellido">Apellido del empleado</param>
        /// <param name="usuario">Usuario del empleado</param>
        /// <param name="password">Contraseña del empleado</param>
        /// <param name="mail">Mail del empleado</param>
        /// <param name="activo">Determina si está activo en la base de datos</param>
        /// <param name="idEmpleado">Determina el empleado a modificar</param>
        /// <returns>Devuelve true si fue modificado correctamente o false si falló</returns>
        public bool updateEmpleado(int idSector, string nombre, string apellido, string usuario, string password, string mail, bool activo, int idEmpleado)
        {
            Boolean correcto = false;
            MySqlConnection conexion = Conexion.conexionMySQL();
            try
            {
               
                conexion.Open();
                MySqlCommand modificar = conexion.CreateCommand();
                modificar.CommandText = "UPDATE empleados SET id_sector = @idSector, Nombre = @nombre, Apellido = @apellido, Usuario = @usuario, Password = @password, Mail = @mail, Activo = @activo WHERE id = @idEmpleado";
                modificar.Parameters.AddWithValue("@idSector", idSector);
                modificar.Parameters.AddWithValue("@nombre", nombre);
                modificar.Parameters.AddWithValue("@apellido", apellido);
                modificar.Parameters.AddWithValue("@usuario", usuario);
                modificar.Parameters.AddWithValue("@password", password);
                modificar.Parameters.AddWithValue("@mail", mail);
                modificar.Parameters.AddWithValue("@activo", activo);
                modificar.Parameters.AddWithValue("@idEmpleado", idEmpleado);
                modificar.ExecuteNonQuery();
                correcto = true;
                conexion.Close();
                conexion.Dispose();
            }
            catch (Exception ex)
            {
                correcto = false;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return correcto;
        }

        /// <summary>
        /// Elimina un empleado
        /// </summary>
        /// <param name="usuario">Determina el empleado a eliminar</param>
        /// <returns>Devuelve true si fue eliminado correctamente o false si falló</returns>
        public bool deleteEmpleado(string usuario)
        {
            Boolean correcto = false;
            MySqlConnection conexion = Conexion.conexionMySQL();
            try
            {
                
                conexion.Open();
                MySqlCommand eliminar = conexion.CreateCommand();
                eliminar.CommandText = "UPDATE empleados SET Activo = @activo WHERE Usuario = @usuario";
                eliminar.Parameters.AddWithValue("@activo", 0);
                eliminar.Parameters.AddWithValue("@usuario", usuario);
                eliminar.ExecuteNonQuery();
                correcto = true;
            }
            catch (Exception ex)
            {
                correcto = false;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return correcto;
        }

        /// <summary>
        /// Lista los empleados
        /// </summary>
        /// <returns>Devuelve una lista con todos los empleados</returns>
        public List<empleados> getAllEmpleado()
        {
            List<empleados> empleados = new List<empleados>();
            MySqlConnection conexion = Conexion.conexionMySQL();
            try
            {
               
                conexion.Open();
                MySqlCommand listado = conexion.CreateCommand();
                listado.CommandText = "SELECT * FROM empleados";
                MySqlDataReader lector = listado.ExecuteReader();
                while (lector.Read())
                {
                    int ID = Convert.ToInt16(lector["id"].ToString());
                    string Apellido = lector["Apellido"].ToString();
                    string Nombre = lector["Nombre"].ToString();
                    int ID_Sector = Convert.ToInt16(lector["id_sector"].ToString());
                    string Mail = lector["Mail"].ToString();
                    string Password = lector["Password"].ToString();
                    string Usuario = lector["Usuario"].ToString();
                    bool Activo = Convert.ToBoolean(lector["Activo"].ToString());
                    empleados empleado  = new empleados();
                    empleado.ID = ID;
                    empleado.Apellido = Apellido;
                    empleado.Nombre = Nombre;
                    empleado.ID_Sector = ID_Sector;
                    empleado.Mail = Mail;
                    empleado.Password = Password;
                    empleado.Usuario = Usuario;
                    empleado.Activo = Activo;
                    empleados.Add(empleado);
                }

                lector.Close();
                lector.Dispose();
                conexion.Close();
                conexion.Dispose();

            }
            catch (Exception ex)
            {
                empleados = null;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return empleados;
        }

        /// <summary>
        /// Obtiene un empleado
        /// </summary>
        /// <param name="usuario">Determina el empleado a obtener</param>
        /// <returns>Devuelve un objeto empleado</returns>
        public empleados getEmpleado(string usuario)
        {
            empleados empleado = new empleados();
            MySqlConnection conexion = Conexion.conexionMySQL();
            try
            {
                
                conexion.Open();
                MySqlCommand consulta = conexion.CreateCommand();
                consulta.CommandText = "SELECT * FROM empleados WHERE Usuario = @usuario";
                consulta.Parameters.AddWithValue("@usuario", usuario);
                MySqlDataReader lector = consulta.ExecuteReader();
                while (lector.Read())
                {
                    empleado.ID = Convert.ToInt16(lector["id"].ToString());
                    empleado.Apellido = lector["Apellido"].ToString();
                    empleado.Nombre = lector["Nombre"].ToString();
                    empleado.ID_Sector = Convert.ToInt16(lector["id_sector"].ToString());
                    empleado.Mail = lector["Mail"].ToString();
                    empleado.Password = lector["Password"].ToString();
                    empleado.Usuario = lector["Usuario"].ToString();
                    empleado.Activo = Convert.ToBoolean(lector["Activo"].ToString());
                }
                lector.Close();
                lector.Dispose();
                conexion.Close();
                conexion.Dispose();

            }
            catch (Exception ex)
            {
                empleado = null;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return empleado;
        }

        /// <summary>
        /// Tabla de empleados
        /// </summary>
        /// <returns>Devuelve una tabla con todos los empleados</returns>
        public DataTable getTablaEmpleados()
        {
            DataTable tablaEmpleados = new DataTable();
            MySqlConnection conexion = Conexion.conexionMySQL();
            try
            {

                conexion.Open();
                MySqlCommand listado = conexion.CreateCommand();
                listado.CommandText = "SELECT e.id, s.Nombre, e.Nombre, e.Apellido, e.Usuario, e.Password, e.Mail, e.Activo FROM empleados e INNER JOIN sectores s ON s.id = e.id_sector";
                MySqlDataAdapter adaptador = new MySqlDataAdapter(listado);
                adaptador.Fill(tablaEmpleados);
                adaptador.Dispose();
                conexion.Close();
                conexion.Dispose();

            }
            catch (Exception ex)
            {
                tablaEmpleados = null;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return tablaEmpleados;
        }
    }
}
